package manejador;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import persistencia.Conexion;

import entidad.Horario;

import interfaz.IEntidad;
import interfaz.IManejador;

public class ManejadorDeHorario implements IManejador {

	private ResultSet rs = null;
	private PreparedStatement stmt = null;
	private static ManejadorDeHorario instancia = null;
	private Horario horario = null;
	private List<IEntidad> horarios = null;
	private Conexion conexion = null;

	private ManejadorDeHorario() {
		conexion = Conexion.getInstancia();
	}

	public static ManejadorDeHorario getInstancia() {
		if (instancia == null) {
			instancia = new ManejadorDeHorario();
		}
		return instancia;
	}

	@Override
	public int agregar(IEntidad entidad) {
		int fila = 0;
		horario = (Horario) entidad;
		String sql = "INSERT INTO sistema_informacion.horario VALUES(0,?, ?, ?, ?);";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, horario.getDia());
			stmt.setString(2, horario.getHoraEntrada());
			stmt.setString(3, horario.getHoraSalida());
			stmt.setInt(4, horario.getIdAula());
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return fila;
	}

	private int eliminarDependencia(int id) {
		int fila = 0;
		String sql = "DELETE FROM sistema_informacion.horario_curso WHERE id_horario = ? ;";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setInt(1, id);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return fila;
	}

	@Override
	public int eliminar(int id) {
		eliminarDependencia(id);
		int fila = 0;
		String sql = "DELETE FROM sistema_informacion.horario WHERE id_horario = ? ;";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setInt(1, id);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return fila;
	}

	public List<IEntidad> getHorarioPorAula(int idAula) {
		horarios = new ArrayList<IEntidad>();
		String sql = "SELECT * FROM sistema_informacion.horario WHERE id_aula = "
				+ idAula;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				IEntidad horario = new Horario(rs.getInt("id_horario"), rs
						.getString("dia"), rs.getString("hora_entrada"), rs
						.getString("hora_salida"), rs.getInt("id_aula"));
				horarios.add(horario);

			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return horarios;
	}

	@Override
	public List<IEntidad> getEntidad() {
		horarios = new ArrayList<IEntidad>();
		String sql = "SELECT * FROM sistema_informacion.horario ;";
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				IEntidad horario = new Horario(rs.getInt("id_horario"), rs
						.getString("dia"), rs.getString("hora_entrada"), rs
						.getString("hora_salida"), rs.getInt("id_aula"));
				horarios.add(horario);

			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return horarios;
	}

	@Override
	public IEntidad getEntidadPorId(int id) {
		String sql = "SELECT * FROM sistema_informacion.horario WHERE id_horario = "
				+ id;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				horario = new Horario(rs.getInt("id_horario"), rs
						.getString("dia"), rs.getString("hora_entrada"), rs
						.getString("hora_salida"), rs.getInt("id_aula"));

			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return horario;
	}

	@Override
	public int modificar(IEntidad entidad, int id) {
		int fila = 0;
		horario = (Horario) entidad;
		String sql = "UPDATE sistema_informacion.horario SET dia = ?, hora_entrada = ? , hora_salida = ?, id_aula=? WHERE id_horario = ? ;";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, horario.getDia());
			stmt.setString(2, horario.getHoraEntrada());
			stmt.setString(3, horario.getHoraSalida());
			stmt.setInt(4, horario.getIdAula());
			stmt.setInt(5, id);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return fila;
	}

	@Override
	public int agregarEmpleadoConCelular(IEntidad entidad) {
		// TODO Auto-generated method stub
		return 0;
	}

	public List<Horario> getHorarioPorCurso(int idCurso) {
		ArrayList<Horario> horarios = new ArrayList<Horario>();
		String sql = "SELECT horario.* FROM curso, horario, horario_curso WHERE curso.id_curso = horario_curso.id_curso AND horario.id_horario = horario_curso.id_horario AND curso.id_curso = "
				+ idCurso;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				horario = new Horario(rs.getInt("id_horario"), rs
						.getString("dia"), rs.getString("hora_entrada"), rs
						.getString("hora_salida"), rs.getInt("id_aula"));
				horarios.add(horario);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return horarios;

	}

	public int agregarHorarioYCurso(int cantidad, int idCurso) {
		int fila = 0;
		ArrayList<Integer> ids = (ArrayList<Integer>) this
				.getUltimosHorarios(cantidad);
		for (int x = 0; x < ids.size(); x++) {
			String sql = "INSERT INTO horario_curso VALUES(?,?)";
			stmt = conexion.hacerEnunciado(sql);
			try {
				stmt.setInt(1, ids.get(x));
				stmt.setInt(2, idCurso);
				fila = stmt.executeUpdate();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return fila;
	}

	public List<Integer> getUltimosHorarios(int cantidad) {
		List<Integer> idHorario = new ArrayList<Integer>();
		String sql = "SELECT id_horario FROM horario order by id_horario DESC limit "
				+ cantidad;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				int id = new Integer(rs.getInt(1));
				idHorario.add(id);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return idHorario;
	}

}
